﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using personalplaner.servicemodel.common;
using personalplaner.gui.common.views;
using personalplaner.business.common;
using System.Reflection;
using personalplaner.business.enums;
using personalplaner.core.errorhandling;
using personalplaner.common.mvvm.common;
using personalplaner.services;
using personalplaner.common.services;
using personalplaner.servicemodel.dataaccess;

namespace personalplaner
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            // set a default style
            var styleService = ServiceLocator.GetGlobalService<IApplicationStyleService, ApplicationStyleService>();
            styleService.SelectStyle("Dark");

			// register golbal services
			personalplaner.common.mvvm.common.ServiceLocator.RegisterGlobalService<IErrorLoger>(new ErrorLoger());
            personalplaner.common.mvvm.common.ServiceLocator.RegisterGlobalService<IMessageBoxService>(new MessageBoxService());

			MainWindow = new MainWindow();

			// check if the connection information is allready stored and is valid
			var dbhelper = new DatabaseConectionHelper();

            bool anmeldungOK = true;
            if (e.Args.Length > 0 && !string.IsNullOrEmpty(e.Args[0]))
                anmeldungOK = dbhelper.TestConnection(e.Args[0]);
            else
                anmeldungOK = dbhelper.TestConnection();

			if (!anmeldungOK)
			{
				var wnd = new LoginDialog(dbhelper.LoginData);
				if (wnd.ShowDialog() == true)
				{
					anmeldungOK = true;
				}
			}

			if (!anmeldungOK)
			{
				Application.Current.Shutdown();
				return;
			}

        	var settings = new DatabaseSettings()
			{
				ConnetionString = string.Format("DSN={0};UID={1};PWD={2};Database={3};", dbhelper.LoginData.DSN, dbhelper.LoginData.UserName, dbhelper.LoginData.Password, dbhelper.LoginData.Database)
			};

            //TODO: set the correct settings
			personalplaner.common.SettingsProvider.Settings = new Settings
			{
				//Mandant = "li",
				//User = "linde",
				DatabaseSettings = settings
			};


			if (anmeldungOK)
			{
				var version = Assembly.GetExecutingAssembly().GetName().Version;
				var versionCompare = dbhelper.CompareDatabaseVersion(settings, version);
				// if the db version is smaller than the application version
				// the user has to start the sqlwizz to update the database
				if (versionCompare != enVersionCompare.SameVersion)
				{
					switch (versionCompare)
					{
						case enVersionCompare.DatabseVersionIsSmaller:
							MessageBox.Show("Die Datenbankversion ist älter als die Version des WickedFlame Personalplaners." +
								"\n\nBitte starten Sie den Databasewizard für die aktualisierung der Datenbank oder benachrichtigen ihren Systemadministrator." +
								"\n\nDatenbank Version: " + dbhelper.GetDatabaseVersion(settings) +
								"\nPersonalplaner Version: " + version
								, "Consistency check"
								, MessageBoxButton.OK
								, MessageBoxImage.Exclamation);
							break;
						case enVersionCompare.ApplicationVersionIsSmaller:
							MessageBox.Show("Die Datenbankversion ist neuer als die Version des WickedFlame Personalplaners." +
								"\n\nBitte installieren Sie die aktuelle Version des WF Personalplaners oder benachrichtigen ihren Systemadministrator." +
								"\n\nDatenbank Version: " + dbhelper.GetDatabaseVersion(settings) +
								"\nPersonalplaner Version: " + version
								, "Consistency check"
								, MessageBoxButton.OK
								, MessageBoxImage.Exclamation);
							break;
						case enVersionCompare.NoVersion:
							MessageBox.Show("Es existiert keine Datenbank.\n\nBitte starten Sie den SQLWizz für die erstellung der Datenbank.", "Consistency check", MessageBoxButton.OK);
							break;
					}
#if DEBUG // start application anyway if is in debugmode
#else
                    if (versionCompare == enVersionCompare.DatabseVersionIsSmaller)
                    {
                        if (System.IO.File.Exists(@"DatabaseWizard.exe"))
                        {
                            // datenbankwizard starten damit die datenbank aktualisiert werden kann
                            var dbWizardProcess = new System.Diagnostics.Process();
                            dbWizardProcess.StartInfo.FileName = @"DatabaseWizard.exe";
                            dbWizardProcess.Start();
                        }
                    }

                    Application.Current.Shutdown();
					return;
#endif
                }

				var inithelper = new InitSettingsHelper(personalplaner.common.SettingsProvider.Settings);

				if (inithelper.CheckIfOpenYearExists() == false)
				{
					// Wenn noch kein aktives Jahr vorhanden ist dann wird der wizard für die basisdaten gestartet
                    var wiz = new InitWizard();
                    if (wiz.ShowDialog() != true)
                    {
                        Application.Current.Shutdown();
                        return;
                    }
				}

				personalplaner.common.SettingsProvider.Settings.Year = inithelper.GetActiveYear();
				personalplaner.common.SettingsProvider.Settings.YearId = inithelper.GetActiveYearId();
                personalplaner.common.SettingsProvider.Settings.Mandant = inithelper.GetMandid();

                // create and register the options service
                var options = new personalplaner.servicemodel.dataaccess.OptionsDataAccess(personalplaner.common.SettingsProvider.Settings);
                personalplaner.common.mvvm.common.ServiceLocator.RegisterGlobalService<IOptionsDataAccess>(options);

                var style = options.Style;
                if (!string.IsNullOrEmpty(style))
                    styleService.SelectStyle(style);

				try
				{
                    var dc = MainWindow.DataContext as personalplaner.viewmodels.MainWindowViewModel;
                    if (dc != null)
                        dc.Database = dbhelper.LoginData.Database;

					// Start main application
					MainWindow.Show();
				}
				catch (Exception ex)
				{
					MessageBox.Show("Es ist ein schwerer Fehler aufgetreten.\n\n" + ex.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);

                    personalplaner.core.errorhandling.ActionLogger.LoggMessage(MessageType.ERROR, ex.Message);

                    Application.Current.Shutdown();
				}
			}
        }
    }
}
